Fix many-to-many relationship queries with custom schema linking objects#3106
Fix many-to-many relationship queries with custom schema linking objects#3106anushakolan merged 7 commits intomainfrom
Conversation
|
@copilot why is the PR not published yet? |
The PR is published and ready for review. The branch |
|
@copilot the PR is still in draft state. |
I don't have the ability to change the PR from draft to ready for review. This requires marking the PR as "Ready for review" in the GitHub UI. A maintainer or the PR author would need to click the "Ready for review" button on the PR page to publish it. |
There was a problem hiding this comment.
Pull request overview
Fixes SQL Server GraphQL many-to-many relationship failures when the linking object is in a non-dbo schema by making DatabaseObject equality/hash behavior case-insensitive so FK lookups succeed despite casing differences between config and database metadata.
Changes:
- Update
DatabaseObject.Equals()to useStringComparison.OrdinalIgnoreCasefor schema/object name comparisons. - Update
DatabaseObject.GetHashCode()to align with case-insensitive equality. - Add a unit test intended to cover many-to-many relationships with linking objects in custom schemas and varying casing.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| src/Config/DatabasePrimitives/DatabaseObject.cs | Makes DatabaseObject equality case-insensitive to prevent FK lookup misses due to casing. |
| src/Service.Tests/UnitTests/ConfigValidationUnitTests.cs | Adds a new data-driven test for custom-schema linking objects in M:N relationships. |
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…verification Co-authored-by: anushakolan <45540936+anushakolan@users.noreply.github.com>
|
/azp run |
|
Azure Pipelines successfully started running 6 pipeline(s). |
…cts (#3106) ## Why make this change? GraphQL queries with M:N relationships fail with SQL error 208 ("Invalid object name") when the linking object uses a custom schema (e.g., `"linkingObject": "mySchema.books_authors"`). The query works only if a table with the same name exists in `dbo`. ## What is this change? `DatabaseObject.Equals()` and `GetHashCode()` used case-sensitive string comparison. SQL Server schema/table names are case-insensitive, causing FK definition lookups to fail when database-returned names differ in casing from config-specified names. - **DatabaseObject.cs**: Use `StringComparison.OrdinalIgnoreCase` for `Equals()` and `StringComparer.OrdinalIgnoreCase.GetHashCode()` for `GetHashCode()` ```csharp public bool Equals(DatabaseObject? other) { return other is not null && string.Equals(SchemaName, other.SchemaName, StringComparison.OrdinalIgnoreCase) && string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase); } ``` ## How was this tested? - [ ] Integration Tests - [x] Unit Tests Added `TestRelationshipWithLinkingObjectInCustomSchema` with test cases for: - Custom schema linking object (`mySchema.TEST_SOURCE_LINK`) - Uppercase schema (`MYSCHEMA.TEST_SOURCE_LINK`) - Lowercase schema and table (`myschema.test_source_link`) The test uses case-mismatched `DatabaseTable` instances (linking table with lowercase, source tables with uppercase) to ensure the test fails if `DatabaseTable.Equals` becomes case-sensitive again. Additionally, `Verify(..., Times.Never)` assertions guard against the original dbo-fallback regression by asserting `VerifyForeignKeyExistsInDB` is never called with a `DatabaseTable` whose `SchemaName` is `dbo`. ## Sample Request(s) ```graphql query { authors { items { id books { items { title } } } } } ``` With config: ```json "authors": { "relationships": { "books": { "cardinality": "many", "target.entity": "books", "linking.object": "mySchema.books_authors", "linking.source.fields": ["author_id"], "linking.target.fields": ["book_id"] } } } ``` <!-- START COPILOT CODING AGENT SUFFIX --> <!-- START COPILOT ORIGINAL PROMPT --> <details> <summary>Original prompt</summary> > work on the github issue #3071 </details> <!-- START COPILOT CODING AGENT TIPS --> --- ✨ Let Copilot coding agent [set things up for you](https://github.com/Azure/data-api-builder/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Alekhya-Polavarapu <67075378+Alekhya-Polavarapu@users.noreply.github.com> Co-authored-by: Anusha Kolan <anushakolan10@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: anushakolan <45540936+anushakolan@users.noreply.github.com>
Why make this change?
GraphQL queries with M:N relationships fail with SQL error 208 ("Invalid object name") when the linking object uses a custom schema (e.g.,
"linkingObject": "mySchema.books_authors"). The query works only if a table with the same name exists indbo.What is this change?
DatabaseObject.Equals()andGetHashCode()used case-sensitive string comparison. SQL Server schema/table names are case-insensitive, causing FK definition lookups to fail when database-returned names differ in casing from config-specified names.StringComparison.OrdinalIgnoreCaseforEquals()andStringComparer.OrdinalIgnoreCase.GetHashCode()forGetHashCode()How was this tested?
Added
TestRelationshipWithLinkingObjectInCustomSchemawith test cases for:mySchema.TEST_SOURCE_LINK)MYSCHEMA.TEST_SOURCE_LINK)myschema.test_source_link)The test uses case-mismatched
DatabaseTableinstances (linking table with lowercase, source tables with uppercase) to ensure the test fails ifDatabaseTable.Equalsbecomes case-sensitive again. Additionally,Verify(..., Times.Never)assertions guard against the original dbo-fallback regression by assertingVerifyForeignKeyExistsInDBis never called with aDatabaseTablewhoseSchemaNameisdbo.Sample Request(s)
With config:
Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.